<?php

namespace App\Admin\Metrics\Examples;

use App\Models\User;
use Carbon\Carbon;
use Dcat\Admin\Widgets\Metrics\Line;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class NewUsers extends Line
{
    /**
     * 初始化卡片内容
     *
     * @return void
     */
    protected function init()
    {
        parent::init();

        $this->title('注册用户总数');
//        $this->dropdown([
//            '7' => 'Last 7 Days',
//            '28' => 'Last 28 Days',
//            '30' => 'Last Month',
//            '365' => 'Last Year',
//        ]);
    }

    /**
     * 处理请求
     *
     * @param Request $request
     *
     * @return mixed|void
     */
    public function handle(Request $request)
    {
        $generator = function ($len, $min = 10, $max = 300) {
            for ($i = 0; $i <= $len; $i++) {
                yield mt_rand($min, $max);
            }
        };

        switch ($request->get('option')) {
            case '365':
                // 卡片内容
                $this->withContent(mt_rand(1000, 5000).'k');
                // 图表数据
                $this->withChart(collect($generator(30))->toArray());
                break;
            case '30':
                // 卡片内容
                $this->withContent(mt_rand(400, 1000).'k');
                // 图表数据
                $this->withChart(collect($generator(30))->toArray());
                break;
            case '28':
                // 卡片内容
                $this->withContent(mt_rand(400, 1000).'k');
                // 图表数据
                $this->withChart(collect($generator(28))->toArray());
                break;
            case '7':
            default:
                // 卡片内容
                $userCount = User::count();
                $this->withContent($userCount.'人');
                // 图表数据
                $chartData = [];
                $time = 7;
                $data = User::where('created_at', '<', Carbon::now())
                    ->where('created_at', '>', $time > 1 ? Carbon::today()->subDays($time) : Carbon::today())
                    ->select([$time > 1 ? DB::raw('DATE(created_at) as time') : DB::raw('DATE_FORMAT(created_at,\'%H\') as time'), DB::raw('COUNT("*") as count')])
                    ->groupBy('time')
                    ->get();

                $chartData = [0, 0, 0, 0, 0, 0, 0];
                if (!$data->isEmpty()) {
                    for ($i = 0; $i < 7; $i++) {
                        $item_data = explode(' ', Carbon::today()->subDays(7 - $i)->toArray()['formatted'])[0];
                        foreach ($data as $dataVal) {
                            if ($dataVal->time == $item_data) {
                                $chartData[$i] = $dataVal->count;
                                break;
                            }
                        }
                    }
                }

                $this->withChart($chartData);
        }
    }

    /**
     * 设置图表数据.
     *
     * @param array $data
     *
     * @return $this
     */
    public function withChart(array $data)
    {
        return $this->chart([
            'series' => [
                [
                    'name' => $this->title,
                    'data' => $data,
                ],
            ],
        ]);
    }

    /**
     * 设置卡片内容.
     *
     * @param string $content
     *
     * @return $this
     */
    public function withContent($content)
    {
        return $this->content(
            <<<HTML
<div class="d-flex justify-content-between align-items-center mt-1" style="margin-bottom: 2px">
    <h2 class="ml-1 font-lg-1">{$content}</h2>
<!--    <span class="mb-0 mr-1 text-80">{$this->title}</span>-->
    <span class="mb-0 mr-1 text-80">7天注册用户曲线</span>
</div>
HTML
        );
    }
}
